src/nntpcache.c

/* [<][>]
[^][v][top][bottom][index][help] */

FUNCTIONS

This source file includes following functions.
  1. bigToStr
  2. settaskinfo
  3. task_info_init
  4. task_info_new
  5. task_info_free
  6. sigterm
  7. sigint
  8. sigsegv
  9. sigusr1
  10. sigusr2
  11. sighup
  12. sigalrm
  13. set_client_sigset
  14. check_child
  15. sigchld
  16. sigpipe
  17. ncExit
  18. make_vm_proc
  19. retire_vm_proc
  20. load_config
  21. decomment
  22. load_groups
  23. set_cfg_shm
  24. load_servers
  25. findScfg
  26. perform_chroot
  27. usage
  28. drop_priv
  29. drop_idle_servers
  30. emit_banner
  31. relay_unknown
  32. client_cmd
  33. client_cmd_loop
  34. client_handler
  35. createPort
  36. master_loop
  37. main
  38. calloc_dummy

/* $Id: nntpcache.c,v 1.3 1998/08/02 21:01:28 proff Exp $
 * $Copyright$
 */

#include "nglobal.h"
#include "network.h"

#include "dbz.h"
#include "mmalloc.h"

#include "acc.h"
#include "article.h"
#include "build_history.h"
#include "date.h"
#include "expire.h"
#include "group.h"
#include "http.h"
#include "ihave.h"
#include "ipc.h"
#include "mmap.h"
#include "newgroups.h"
#include "newnews.h"
#include "next.h"
#include "nocem.h"
#include "post.h"
#include "xover.h"
#include "xpath.h"

#include "nntpcache.h"

extern char *optarg;

EXPORT bool volatile HoldForks = FALSE;
EXPORT bool volatile HoldForksClient = FALSE;
EXPORT bool volatile HoldForksHttp = FALSE;
EXPORT bool volatile HoldForksUpdate = FALSE;
EXPORT bool volatile HoldForksNocem = FALSE;
EXPORT bool SwapWithChild = FALSE;
EXPORT struct nnconf *con = &nnconf;
EXPORT struct strStack *slaveClient;
EXPORT bool f_cleanSlate = TRUE;
EXPORT time_t ClientTimeStarted;
EXPORT struct newsgroup *CurrentGroupNode;
EXPORT char CurrentDir[MAX_PATH];
EXPORT int CurrentGroupArtNum;
EXPORT int CurrentGroupArtRead;
EXPORT bool GroupNextNoCache = FALSE;   /* set by post.c to force a one-shot cache miss on the next GROUP command */
EXPORT bool CurrentGroupXoverIsFilt;
EXPORT bool CurrentGroupNocem;
EXPORT struct authent *CurrentGroupAuth;
EXPORT struct authent *ConnectAuth;
EXPORT struct strList *overviewFmt;
EXPORT n_u32 overviewFmt_hash;
EXPORT struct strList *overviewFmtBozo;
EXPORT n_u32 overviewFmtDef_hash;
EXPORT char ClientHost[128 + 1 + MAX_HOST];
EXPORT char ClientHostNormal[MAX_HOST];
EXPORT char ClientHostLocal[MAX_HOST];
EXPORT char ClientHostRFC931[128 + 1 + MAX_HOST];
EXPORT char ClientHostLocalRFC931[128 + 1 + MAX_HOST];
EXPORT char ClientHostAddr[MAX_HOST];
EXPORT char ClientHostAddrRFC931[128 + 1 + MAX_HOST];
EXPORT char *RemoteHosts[] =
{
        ClientHost, ClientHostNormal, ClientHostLocal, ClientHostRFC931, ClientHostLocalRFC931,
                ClientHostAddr, ClientHostAddrRFC931, NULL
};

EXPORT char Host[MAX_HOST];
EXPORT bool ModeReader = FALSE; /* ModeReader sent */
EXPORT struct server_cfg *ServerList;
EXPORT struct group_cfg *GroupList;
EXPORT struct server_cfg *CurrentGroupScfg;
EXPORT struct server_cfg *CurrentIDScfg;
EXPORT enum auth_state AuthState = none;
EXPORT char authUser[MAX_USERNAME] = "";
EXPORT bool MakeHistory = FALSE;
EXPORT void *Mbase;
EXPORT bool mmapAnon = FALSE;
static int NNTPportFD = -1;
static int HTTPportFD = -1;
static char PidFile[MAX_PATH] = "";
EXPORT int Master_fd = -1;
EXPORT fd_set r_set;            /* master client fd list */
static int volatile high_fd;    /* highest fd in r_set */
static int ncUID;
static int ncGID;
static struct sigaction myaction;
static struct task_info dummy_task;     /* this is for oneshots */
EXPORT struct task_info *Task = &dummy_task;
EXPORT struct task_info **TaskList;
static int task_max = FD_HIGH+40;
EXPORT struct command *Command;
EXPORT struct cache_stats *CS;

EXPORT struct command commands[] = 
{
        {"ARTICLE", c_article, "[<msgid> | artno]"},
        {"AUTHINFO", c_authinfo, "USER username|PASS password"},
        {"BODY", c_body, "[<msgid> | artno]"},
        {"DATE", c_date, ""},
        {"GROUP", c_group, "newsgroup"},
        {"HEAD", c_head, "[<msgid> | artno]"},
        {"HELP", c_help, ""},
        {"IHAVE", c_ihave, "<msgid>"},
        {"LAST", c_last, ""},
        {"LIST", c_list, "[ACTIVE | ACTIVE.TIMES | NEWSGROUPS | SUBSCRIPTIONS | OVERVIEW.FMT] [pattern]"},
        {"LISTGROUP", c_listgroup, "[newsgroup]"},
        {"MODE", c_mode, "[READER | QUERY]"},
        {"NEWGROUPS", c_newgroups, "yymmdd hhmmss [GMT] [distributions]"},
        {"NEWNEWS", c_newnews, "newsgroups yymmdd hhmmss [GMT] [distributions]"},
        {"NEXT", c_next, ""},
        {"NOOP", c_noop, ""},
        {"POST", c_post, ""},
        {"QUIT", c_quit, ""},
        {"SLAVE", c_slave, ""},
        {"STAT", c_stat, "[<msgid> | artno}"},
        {"XGTITLE", c_xgtitle, "[pattern]"},
        {"XHDR", c_xhdr, "header [<msgid> | range]"},
        {"XOVER", c_xover, "[<msgid> | range]"},
        {"XPATH", c_xpath, "[<msgid | artno]"},
        {NULL, c_none}
};

EXPORT char *task_desc[] = /* keep in-sync with enum task_state! */
{
    "none",
    "master",
    "client",
    "update",
    "expire",
    "nocem",
    "oneshot",
    "http",
    NULL /* nc_last */
};

/* bit length resiliant binary to decimal converter */

EXPORT char *bigToStr(big_t big)
/* [<][>][^][v][top][bottom][index][help] */
{
    int n;
    bool neg;
    char *p;
#define RING_NUM 64 /* > max number of bigToStr's ever used as concurrent function arguments */
    static char *ring[RING_NUM];        
    static int ring_idx;
    char buf[128];
    buf[sizeof(buf)-1] = '\0';
    n=sizeof(buf)-2;
    if (big<0)
        {
            big *=-1;
            neg = TRUE;
        }
    else
        neg = FALSE;
    do
        {
            buf[n] = big%10 + '0';
            big/=10;
        } while (--n > 0  && big >=1);
    if (neg)
        buf[n--] = neg;
    if ((p=ring[ring_idx]))
        free(p);
    p = ring[ring_idx] = Sstrdup(&buf[n+1]);
    if (++ring_idx >= RING_NUM)
        ring_idx = 0;
    return p;
}

EXPORT void settaskinfo (char *fmt, ...)
/* [<][>][^][v][top][bottom][index][help] */
{
    va_list ap;
    char buf[MAX_LINE];
    va_start(ap, fmt);
    vsnprintf(buf, sizeof buf, fmt, ap);
    setproctitle("%s", buf);
    strncpy(Task->ti_status_line, buf, sizeof(Task->ti_status_line)-1);
    Task->ti_status_line[sizeof(Task->ti_status_line)-1] = '\0';
    va_end(ap);
}

static struct task_info **task_info_init ()
/* [<][>][^][v][top][bottom][index][help] */
{
    return (TaskList = XMcalloc(sizeof(struct task_info *), task_max));
}

/*
 * name MUST be in the text segment or permanetly in the shared data segment.
 */

static struct task_info *task_info_new (enum task_state state, char *name)
/* [<][>][^][v][top][bottom][index][help] */
{
    int n;
    struct task_info *t;
    
    for (n=0; n<task_max; n++)
        if (!TaskList[n])
            goto found;
    loge (("task_info_new() no more tasks (max = %d)", task_max));
    return NULL;
 found:
    t = XMcalloc(sizeof *t, 1);
    t->ti_started = time(NULL);
    t->ti_state = state;
    t->ti_pid = getpid();
    t->ti_name = name;
    t->ti_idx = n;
    TaskList[n] = t;
    Stats->task_stats[state].invocations++;
    if (Stats->task_high<n)
        Stats->task_high = n;
    if (state == nc_client)
        Stats->clientsActive++;
    return t;
}

static void task_info_free (int n)
/* [<][>][^][v][top][bottom][index][help] */
{
    struct task_info *p = TaskList[n];
    TaskList[n] = NULL;
    if (p)
        {
            if (p->ti_state == nc_client)
                Stats->clientsActive--;
            XMfree(p);
        }
    if (Stats->task_high<n)
        {
            for (n=Stats->task_high;n>=0 && !TaskList[n]; n--) {}
            Stats->task_high=n;
        }
}

static RETSIGTYPE sigterm (int sig)
/* [<][>][^][v][top][bottom][index][help] */
{
        signal (SIGTERM, sigterm);
        if (Task->ti_state == nc_master)
        {
                errno = 0;
                logw (("caught SIGTERM: syncing database, syncing disks, exiting"));
        }
        retire_vm_proc (0);
}

static RETSIGTYPE sigint (int sig)
/* [<][>][^][v][top][bottom][index][help] */
{
        static struct nnconf *nn_orig, nn_new;

        signal (SIGINT, sigint);
        if (nn_orig)
        {
                log(("Caught SIGINT - logging set normal"));
                con = nn_orig;
                nn_orig = NULL;
        } else
        {
                nn_orig = con;
                nn_new = *con;
                con = &nn_new;
                con->logFromClient              = TRUE;
                con->logToClient                = TRUE;
                con->logFromServer              = TRUE;
                con->logToServer                = TRUE;
                con->logDebug                   = TRUE;
                con->logInfo                    = TRUE;
                con->logWarnings                = TRUE;
                con->logErrors                  = TRUE;
                con->logListMerge               = TRUE;
                con->logListMergeCorrelation    = TRUE;
                con->logInn                     = TRUE;
                log(("Caught SIGINT - full debug logging set"));
        }
}

static RETSIGTYPE sigsegv (int sig)
/* [<][>][^][v][top][bottom][index][help] */
{
        signal (SIGSEGV, SIG_DFL);
        loge (("SIGSEGV!"));
        Exit (1);
}

static RETSIGTYPE sigusr1 (int sig)
/* [<][>][^][v][top][bottom][index][help] */
{
        signal (SIGUSR1, SIG_IGN);
        updateDaemon (TRUE);
}

static RETSIGTYPE sigusr2 (int sig)
/* [<][>][^][v][top][bottom][index][help] */
{
        signal (SIGUSR2, SIG_IGN);
        expire (TRUE);
}

static int sig_hup = FALSE;

static RETSIGTYPE sighup (int sig)
/* [<][>][^][v][top][bottom][index][help] */
{
        
        sig_hup = TRUE;
        signal (SIGHUP, sighup);
}

static RETSIGTYPE sigalrm (int sig)
/* [<][>][^][v][top][bottom][index][help] */
{
        emitf ("%d Timeout after %s, closing connection.\r\n", NNTP_TEMPERR_VAL, nnitod(con->idleTimeout));
        log (("timeout after %s", nnitod(con->idleTimeout)));
        loginn (("%s timeout", ClientHostNormal));
        retire_vm_proc (0);
}

static void set_client_sigset ()
/* [<][>][^][v][top][bottom][index][help] */
{
    sigemptyset(&myaction.sa_mask);
    sigaddset(&myaction.sa_mask, SIGALRM);
    sigaddset(&myaction.sa_mask, SIGTERM);
    sigaddset(&myaction.sa_mask, SIGPIPE);
    myaction.sa_flags = 0;
    myaction.sa_handler = sigalrm;
    sigaction(SIGALRM, &myaction, NULL);
}

static void check_child ()
/* [<][>][^][v][top][bottom][index][help] */
{
        int n;
#ifdef HAVE_WAIT3
        int pid = wait3 (NULL, WNOHANG, NULL);
#else
#ifdef HAVE_WAITPID
        int pid = waitpid ((pid_t) - 1, NULL, WNOHANG);
#else
#error no wait3 or waitpid for this system
#endif
#endif
        if (pid<1)
            return;
        for (n=0; n<=Stats->task_high; n++)
            if (TaskList[n] && TaskList[n]->ti_pid == pid)
                goto found;
        loge (("check_child() returned unknow pid (%d)", pid));
        return;
 found:
        task_info_free(n);
        if (pid == UpdateDaemonPid)
        {
                UpdateDaemonPid = 0;
                f_cleanSlate = FALSE;
                signal (SIGUSR1, sigusr1);
        } else if (pid == ExpireDaemonPid)
        {
                ExpireDaemonPid = 0;
                signal (SIGUSR2, sigusr2);
        } else if (pid == NocemDaemonPid)
        {
                NocemDaemonPid = 0;
        }
        statsUpdateMaster();
}

static RETSIGTYPE sigchld (int sig)
/* [<][>][^][v][top][bottom][index][help] */
{
        check_child ();
        signal (SIGCHLD, sigchld);
}

static RETSIGTYPE sigpipe (int sig)
/* [<][>][^][v][top][bottom][index][help] */
{
        signal (SIGPIPE, SIG_IGN);      /* syslog can cause a SIGPIPE ! */
        logd (("client disconnected unexpectedly"));
        retire_vm_proc (0);
}


EXPORT void ncExit (int code)
/* [<][>][^][v][top][bottom][index][help] */
{
    sigset_t set;
    struct sigaction action;
    /* ignore anyone interrupting us */
    sigemptyset(&action.sa_mask);
    action.sa_flags = 0;
    action.sa_handler = SIG_IGN;
    sigaction(SIGALRM, &action, NULL);
    sigaction(SIGTERM, &action, NULL);
    sigaction(SIGPIPE, &action, NULL);
    
    if (Task->ti_state == nc_master)
        {
            chdir(con->cacheDir);
            if (!mmapAnon)
                {
                    int fd;
                    struct mmap_base mb;
                    bzero(&mb, sizeof mb);
                    mb.mmap_base = Mbase;
                    fd = open(con->mmapBaseFile, O_WRONLY|O_TRUNC|O_CREAT, 0664);
                    if (fd<0 || write(fd, &mb, sizeof mb)!=sizeof mb)
                        {
                            loge (("couldn't write '%s'", con->mmapBaseFile));
                            unlink (con->mmapBaseFile);
                        }
                    close (fd);
                }
            dbzsync ();
            dbmclose ();
            if (Stats)
                saveStats (con->statsFile);
            unlink (PidFile);
            sync ();
        } else
            {
                if (Task->ti_state == nc_client)
                    {
                        struct tms buffer;

                        n_u32 u, s;
                        
                        if (CurrentGroupArtRead && CurrentGroupScfg && CurrentGroupScfg->group)
                            {
                                loginn (("%s group %s %d", ClientHostNormal, 
                                      CurrentGroupScfg->group, CurrentGroupArtRead));
                            }
                        loginn (("%s exit articles %d groups %d", ClientHostNormal, 
                              ArtRead, GroupsEntered));
                        if (PostsReceived>0 || PostsRejected>0)
                            loginn (("%s posts received %d rejected %d", ClientHostNormal, PostsReceived, PostsRejected));
                        times(&buffer);
                        u = buffer.tms_utime;
                        s = buffer.tms_stime;
                        loginn (("%s times user %.2f system %.2f elapsed %d.00",
                              ClientHostNormal,
                              (double) u/ CLK_TCK,
                              (double) s/ CLK_TCK,
                              time(NULL) - ClientTimeStarted));
                    }
            }
    if (Master_fd >= 0)
        {
            close (Master_fd);
        }
#ifdef MMALLOC
    if (Mbase)
                mmalloc_detach (Mbase);
#endif
    
    /* restore default SIGALRM behavior (ie, crash us out) */
    /* sigemptyset(&action.sa_mask); already done above */
    /* sigaddset(&action.sa_mask, SIGALRM); can't remember why I did this in this 1st place */
    /* action.sa_flags = 0;  already done above */
    action.sa_handler = SIG_DFL;
    sigaction(SIGALRM, &action, NULL);
    
    /* unblock, since we might be in a SIGALRM handler right now! */
    sigemptyset(&set);
    sigaddset(&set, SIGALRM);
    sigprocmask (SIG_UNBLOCK, &set, NULL);
    
    alarm(60);
    flush ();   /* better finish this in 60 seconds, toots. */
    if (code == 0)
        {
            log (("clean shutdown"));
            closelog ();
            exit (code);
        }
    log (("clean shutdown with error %d. dumping core for debug analysis", code));
    chdir(con->cacheDir);
    abort ();
}

/*
 * if client is <0, then we presume we are not a regular client, but
 * an inernal daemon
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int make_vm_proc (enum task_state state, int client, char *name)
/* [<]
 */

EXPORT int